package com.mycase.im.boot.websocket.pattern;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mycase.im.boot.entity.communication.ClientMessage;
import com.mycase.im.boot.entity.communication.ResponseMessage;

import javax.websocket.Session;
import java.util.Map;

/**
 * WebSocket消息处理的策略算法结构(使用策略模式来代替switch分支)
 * @Author ZhuHJay
 * @Date 2021/9/18 17:38
 */
public interface MessageStrategy {

    /** 用来判断该类型是否可被处理
     * @param type #{@link com.mycase.im.boot.websocket.WebSocketSignal}
     * @return 是否可以处理
     */
    Boolean isUse(int type);

    /** 用来对消息进行处理
     * @param clientMessage 客户端发送的消息对象
     * @param clientMaps websocket中存储的在线用户集合
     * @param objectMapper json对象转换工具
     * @param mySession 本人的session
     * @throws Exception 异常信息
     */
    void executeHandler(ClientMessage clientMessage,
                        ObjectMapper objectMapper,
                        Map<String, Session> clientMaps,
                        Session mySession) throws Exception;

    /**
     * 默认方法: 将数据信息发送出去(不论是谁都可以, 但是要保证在线)
     * @param objectMapper json转换工具
     * @param message 消息数据
     * @param session 接收信息者session
     * @throws Exception 异常信息
     */
    default void sendMessage(ObjectMapper objectMapper,
                             Session session,
                             ResponseMessage message) throws Exception{
        session.getBasicRemote().sendText(objectMapper.writeValueAsString(message));
    }

}
